package iface

import (
	"gitee.com/hongzhaomin/gspring/tools"
	"reflect"
)

// BeanDefinition 接口
// =================================================================
// ======================= BeanDefinition ==========================
// =================================================================
type BeanDefinition interface {
	GetParent() BeanDefinition
	SetParent(BeanDefinition) BeanDefinition
	GetBeanName() string
	SetBeanName(beanName string) BeanDefinition
	//GetObject() any
	GetObjRefType() reflect.Type
	GetObjRefTypeToPtr() reflect.Type
	GetCreateBeanMethodInfo() *CreateBeanMethodInfo
	SetCreateBeanMethodInfo(*CreateBeanMethodInfo) BeanDefinition
}

// CreateBeanMethodInfo 结构体
// =======================================================================
// ======================= CreateBeanMethodInfo ==========================
// =======================================================================
type CreateBeanMethodInfo struct {
	MethodName           string
	RtMethod             reflect.Type
	RvMethod             reflect.Value // 注意：这里调用Call方法第一个参数需要传接收者
	ReceiverNotPtr       bool          // true：表示接收者传参时为非指针类型
	RtDeclaredParamIns   []reflect.Type
	RtDeclaredReturnBean reflect.Type
}

func (methodInfo *CreateBeanMethodInfo) Check() {
	tools.Assert().NotBlank(methodInfo.MethodName, "MethodName must not be blank")
	tools.Assert().IsFalse(methodInfo.RvMethod.IsZero(), "RvMethod must not be <nil>")
	tools.Assert().NotNil(methodInfo.RtDeclaredReturnBean, "RtDeclaredReturnBean must not be <nil>")
}
